package pe.bf.extranet.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;

import pe.bf.domain.bean.Empleado;
import pe.bf.domain.bean.Moneda;
import pe.bf.domain.bean.SolicitudCreacion;
import pe.bf.domain.bean.TipoCuenta;
import pe.bf.domain.bean.TipoDocumento;
import pe.bf.domain.bean.Usuario;
import pe.bf.extranet.cliente.ClienteWS;
import pe.bf.extranet.web.utils.CuentaFile;
import pe.bf.extranet.web.utils.DetalleCuentaFile;
import pe.bf.extranet.web.utils.ExportExcel;
import pe.bf.extranet.web.utils.FileParser;


public class SolCreaAboServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public SolCreaAboServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
		doPost(request, response);
		

	}
 
	@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		Usuario usuario=(Usuario)request.getSession().getAttribute("usuarioBean");
		if(usuario==null){
            request.getRequestDispatcher("servlet").forward(request, response); 
            return;
		}
		
		
		String p_accion=request.getParameter("accion");
		obtenerMonedas(request);
		obtenerTipoCuentas(request);
		obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
		String p_archivo=request.getParameter("txtArchivo");
		String p_tipo=request.getParameter("txtTipoCuenta");
		String p_moneda=request.getParameter("txtMoneda"); 		
		String idSolicitud=request.getParameter("idSolicitud");
		String hidFecha=request.getParameter("hidFecha");
		String hidNombre=request.getParameter("hidNombre");
		String hidTipo=request.getParameter("hidTipo");
		String hiIdSolicitud=request.getParameter("hiIdSolicitud");
		
		File uploadedFile = null;
		CuentaFile cuentaFile= null;
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);

	        if (isMultipart) {
	        	
	        	FileItemFactory factory = new DiskFileItemFactory();
	            ServletFileUpload upload = new ServletFileUpload(factory);
	            
	            try {
	            	
				List items = upload.parseRequest(request);
				Iterator iterator = items.iterator();
				
				while (iterator.hasNext()) {
					FileItem item = (FileItem) iterator.next();
					if (item.getFieldName().equals("txtTipoCuenta")) {
						p_tipo = item.getString();
					} else if (item.getFieldName().equals("accion")) {
						p_accion = item.getString();
					} else if (item.getFieldName().equals("txtMoneda")) {
						p_moneda = item.getString();
					} else if (item.getFieldName().equals("idSolicitud")) {
						idSolicitud = item.getString();
					} else if (item.getFieldName().equals("hidFecha")) {
						hidFecha = item.getString();
					} else if (item.getFieldName().equals("hidNombre")) {
						hidNombre = item.getString();
					} else if (item.getFieldName().equals("hidTipo")) {
						hidTipo = item.getString();
					} else if (item.getFieldName().equals("txtArchivo")
							&& p_accion.equals("grabar_creacion_cuenta")) {
						String root = getServletContext().getRealPath("/");
						File path = new File(root + "/solCreaAboServlet");
						if (!path.exists()) {
							boolean status = path.mkdirs();
						}
						
						
						String name = item.getName();
						
						if(name.contains("\\")){
							name = StringUtils.substringAfterLast(name, "\\");
						}

						if(name.contains("/")){
							name = StringUtils.substringAfterLast(name, "/");
						}
						
						uploadedFile = new File(path + "/" + name);
						

						
						item.write(uploadedFile);
						cuentaFile = FileParser
								.parseCuentaFile(new FileInputStream(uploadedFile));
					}

				}
	                
	            } catch (FileUploadException e) {
	                e.printStackTrace();
	                request.setAttribute("error", "Error al abrir el archivo. Confirmar si el formato es correcto.");
	                request.getRequestDispatcher("solcreaabo.jsp").forward(request, response);
	                return;
	            } catch (Exception e) {
	                e.printStackTrace();
	                request.setAttribute("error", e.getMessage());
	                request.getRequestDispatcher("solcreaabo.jsp").forward(request, response);
	                return;
	            }
	            
	        	
	        }
		  
          
           
	        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("ddMMyyyy");
          
		if(p_accion!=null){
			
			 if(p_accion.equals("grabar_creacion_cuenta")){
				 
				 SolicitudCreacion solicitudcreacion=new SolicitudCreacion();  
				 solicitudcreacion.setNombreArchivo(uploadedFile.getName());
				 Date fechaSolicitud=new Date();
				 solicitudcreacion.setFechaCreacionArchivo(formatoDelTexto.format(fechaSolicitud));
				 solicitudcreacion.setTipoCuenta(new TipoCuenta(Long.valueOf(p_tipo),""));
				 solicitudcreacion.setMoneda(new Moneda(Long.valueOf(p_moneda),""));
				 solicitudcreacion.setEmpresa(usuario.getEmpresa());
				 solicitudcreacion.setFechaCreacion(fechaSolicitud);
				 solicitudcreacion.setUsuarioCreacion(usuario.getNombres()); 
				 solicitudcreacion.setAdjunto(read(uploadedFile));
				 solicitudcreacion.setNroRegistros(new BigDecimal(0));

				 List<Empleado> listaEmpleado=new ArrayList<Empleado>();
				 
					try
					{					 
						List<DetalleCuentaFile> detalleCuentaFileList = cuentaFile.getDetalleCuentaFileList();
						
						for (DetalleCuentaFile detalleCuentaFile : detalleCuentaFileList) {

								Empleado empleado=new Empleado();
								empleado.setTipocuenta(new TipoCuenta(Long.valueOf(p_tipo),""));
								empleado.setMoneda(new Moneda(Long.valueOf(p_moneda),""));
								empleado.setEmpresa(usuario.getEmpresa());
								empleado.setUsuariocreacion(usuario.getNombres()); 
								empleado.setTipodocumento(new TipoDocumento(Long.parseLong(detalleCuentaFile.getTipoDoc().trim()))); 
								empleado.setNrodocumento(detalleCuentaFile.getNroDoc().trim());
								empleado.setApellidonombre(detalleCuentaFile.getNombresApellidos().trim());
								empleado.setSexo(new BigDecimal(detalleCuentaFile.getSexo().trim()));								
								Date fecha = formatoDelTexto.parse(detalleCuentaFile.getFechaNacimiento().trim()); 
								empleado.setFechanacimiento(fecha);
								empleado.setEstadocivil(new BigDecimal(detalleCuentaFile.getEstadoCivil().trim()));
								empleado.setOcupacion(detalleCuentaFile.getOcupacion());
								empleado.setTelefono(detalleCuentaFile.getTelefono());
								empleado.setDireccion(detalleCuentaFile.getDireccion());
								empleado.setDistrito(detalleCuentaFile.getDistrito()); 
								empleado.setUbigeo(detalleCuentaFile.getUbigeo().trim());
								empleado.setMoneda(new Moneda(Long.parseLong((detalleCuentaFile.getMoneda()))));
								listaEmpleado.add(empleado);
								
						}
					}
					catch (Exception e)
					{
						obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
						request.setAttribute("error", "Error al leer celdas del archivo. Confirme si el formato es correcto");
						e.printStackTrace();
						request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
						return;
					}

					 solicitudcreacion.setNroRegistros(new BigDecimal(listaEmpleado.size()));
					 Empleado[] empleados= new Empleado[listaEmpleado.size()];
					 solicitudcreacion.setListaEmpleados(listaEmpleado.toArray(empleados));
					 List<String> resultado=grabarSolicitud(solicitudcreacion);
					 
				 if((resultado!=null && resultado.size()==0) || resultado==null){
					 
					 request.setAttribute("mensaje", "Solicitud creada exitosamente.");
					 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa());

				 }else{
					 
					 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
					 request.setAttribute("error", "Error al intentar grabar la solicitud.");
					 request.setAttribute("listaErrores", resultado);
				 }
				 
			 }else if (p_accion.equals("carga_detalle_creacion")){
				 
				 obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa());
				 request.setAttribute("hidTipo",hidTipo);
				 request.setAttribute("hidFecha",hidFecha);
				 request.setAttribute("hidNombre",hidNombre);
				 request.setAttribute("hiIdSolicitud", idSolicitud);
				 obtenerDetalles(request,usuario.getEmpresa().getIdEmpresa(),idSolicitud);
				 request.getSession().setAttribute("hiIdSolicitud",idSolicitud);
			 }
			 
			 
				if(p_accion.equals("exportar_excel")){
					try {
						ExportExcel<SolicitudCreacion> exportExcel= new ExportExcel<SolicitudCreacion>();
						exportExcel.generarExcel(request, response,
								(List<SolicitudCreacion>) request
										.getAttribute("listaSolicitudesAbo"),
								"solicitudedCreacion",
								"reportTemplate_solicitudedCreacion.xls",
								"solicitudedCreacion");
					} catch (Exception e) {
						e.printStackTrace();
					} 
				}
				
				
				if(p_accion.equals("exportar_excel_detalle")){
					try {
						obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa());
						obtenerDetalles(request,usuario.getEmpresa().getIdEmpresa(),(String) request.getSession().getAttribute("hiIdSolicitud"));
						ExportExcel<Empleado> exportExcel= new ExportExcel<Empleado>();
						exportExcel.generarExcel(request, response,
								(List<Empleado>) request
										.getAttribute("listaEmpleado"),
								"empleados",
								"reportTemplate_solicitudedCreacion_detalle.xls",
								"empleados");
					} catch (Exception e) {
						e.printStackTrace();
					} 
				}
				
			 
			 request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
			 return;
		}else{
			obtenerListaSolicitudes(request,usuario.getEmpresa().getIdEmpresa()); 
			request.getRequestDispatcher("solcreaabo.jsp").forward(request, response); 
			return;
		}
		
		
	}
	

	public byte[] read(File file) throws IOException {

		byte[] buffer = new byte[(int) file.length()];
		InputStream ios = null;
		try {
			ios = new FileInputStream(file);
			if (ios.read(buffer) == -1) {
				throw new IOException(
						"EOF reached while trying to read the whole file");
			}
		} finally {
			try {
				if (ios != null)
					ios.close();
			} catch (IOException e) {
			}
		}

		return buffer;
	}
	
	/**
	 * 
	 * @param request
	 */
	private void obtenerMonedas(HttpServletRequest request) {
		List<Moneda> lista = ClienteWS.findMonedas();
		request.setAttribute("lista_moneda", lista);
	}

	/**
	 * 
	 * @param request
	 */
	private void obtenerTipoCuentas(HttpServletRequest request) {
		List<TipoCuenta> lista = ClienteWS.findTipoCuentas();
		request.setAttribute("lista_tipoCuenta", lista);
	}

	/**
	 * 
	 * @param request
	 * @param codigoEmpresa
	 */
	private void obtenerListaSolicitudes(HttpServletRequest request,
			Long codigoEmpresa) {
		List<SolicitudCreacion> lista = ClienteWS
				.listarSolicitudCreacionPorEmpresa(codigoEmpresa);
		request.setAttribute("listaSolicitudesAbo", lista);
	}

	/**
	 * 
	 * @param request
	 * @param codigoEmpresa
	 * @param idSolicitud
	 */
	private void obtenerDetalles(HttpServletRequest request,
			Long codigoEmpresa, String idSolicitud) {
		List<Empleado> lista = ClienteWS.listarDetalleSolicitudCreacion(
				codigoEmpresa, Long.valueOf(idSolicitud));
		request.setAttribute("listaEmpleado", lista);
	}

	/**
	 * 
	 * @param solicitudcreacion
	 * @return
	 */
	private List<String> grabarSolicitud(SolicitudCreacion solicitudcreacion) {
		return ClienteWS.createSolicitudCreacion(solicitudcreacion);
	}

	
	 

}
